#ifndef xpack_macro_xenum_or
#define xpack_macro_xenum_or
#pragma push_macro("xuser")
#undef  xuser
#define xuser mixc::macro_xenum_or::inc
#include"define/base_type.hpp"
#include"meta/unsigned_type.hpp"
#pragma pop_macro("xuser")

#define xenum_or(TYPE)                                                  \
inline TYPE operator | (TYPE left, TYPE right){                         \
    using unsigned_t =                                                  \
        ::mixc::macro_xenum_or::inc::unsigned_type<TYPE>;               \
    return TYPE(u64(unsigned_t(left)) | u64(unsigned_t(right)));        \
}

#endif
